// 实验生成token，登录后将token返回给前端
'use strict';
const Controller = require('egg').Controller;
class LoginController extends Controller {
  async index() {
    const { ctx } = this;
    let params = ctx.request.body;
    const { username , password} = params
    
    // const token = await ctx.app.jwt.sign(params, ctx.app.config.jwt.secret, { expiresIn: "24h" });
    console.log("@@params",params)
    // 判断不为空
    ctx.validate({ username: 'string',password: 'string' }); // 默认判断 ctx.request.body

    // 得到加密
    const encryptedData = ctx.encrypt(password, ctx.app.config.crypto.secret);
    
    // 判断账号密码是否正确 model users
    const user = await ctx.model.Users.findOne({ where: {username, password:encryptedData} });

    if (!user) return ctx.responseData(null, "账号或密码不正确", 1) ; 
        
    console.log("@@user",user)
    const token = ctx.helper.GenerateToken(params)
    ctx.responseData({ token }, "success", 0) 
  }
  async register(){
    const { ctx } = this;
    let params = ctx.request.body;
    const { username , password ,verifyCode} = params
    const crypto = require('crypto');
    
    // 验证 用户账号密码是否为空 
    ctx.validate({ username: "email",password: 'string',verifyCode:"string" }); // 默认判断 ctx.request.body

    // 验证 邮箱验证码 是否正确 
    const redisCode = await ctx.app.redis.get(params.username);
    // console.log("redisCode",redisCode , "verifyCode ",verifyCode)
    if(redisCode != verifyCode)  return ctx.responseData({}, "邮箱验证码未通过", 1) ;
    const token = ctx.helper.GenerateToken(params)


    // 验证是否注册使用过 (修改：注册过则修改密码)
    let user = await ctx.service.users.findAll({username})
    // console.log("@@user",user)
    // if(user.length) return ctx.responseData(null, "邮箱已注册", 1);

    
    // 注册用户  密码加密存入 
    
    // 加密
    const encryptedData = ctx.encrypt(password, ctx.app.config.crypto.secret);
    // console.log("加密输出",encryptedData)
    // 解密
    // const decryptedData = ctx.decrypt(encryptedData, ctx.app.config.crypto.secret)
    // console.log("解密输出",decryptedData)

    // if(user.length) return ctx.service.users.update( {uid:user.dataValues.id, {password: encryptedData} }, { where: { username } });
    user.length ? await ctx.model.Users.update({password: encryptedData}, { where: { username } }) : ctx.service.users.create({ username,email:username,password:encryptedData })

    // ctx.model.Users.create({ username,password })
    ctx.responseData({token}, "恭喜你 ,操作成功", 0)

  }
  async resetPass(){
    const { ctx } = this;
    const { username , password ,verifyCode} = ctx.request.body
    ctx.validate({ username: "email",password: 'string',verifyCode:"string" }); // 默认判断 ctx.request.body

    // 验证是否注册使用过
    let user = await ctx.service.users.findAll({username})
    // console.log("@@user",user)
    if(!user.length) return ctx.responseData(null, "邮箱未注册", 1);

    // 验证 邮箱验证码 是否正确
    const redisCode = await ctx.app.redis.get(username);
    console.log("redisCode",redisCode , "verifyCode ",verifyCode)
    if(redisCode != verifyCode)  return ctx.responseData({}, "邮箱验证码未通过", 1) ;

    // 加密
    const encryptedData = ctx.encrypt(password, ctx.app.config.crypto.secret);

    // 更新密码
    await ctx.model.Users.update({ password: encryptedData }, { where: { username } });
    ctx.responseData(null, "密码重置成功", 0);

    // 删除redis 缓存的邮箱验证码
    await ctx.app.redis.del(username);

  }


}

module.exports = LoginController;
